<?php

/**
 * 数据检查方法
 *
 *
 * @author     Robot
 * @version    1.0
 * @package    Base Framework
 * @access     public
 * @copyright  商业软件,受著作权保护
 * @link       http://***
 */

class Check
{
	/**
	 * 检查GET参数合法性
	 * 
	 */
	public function gets($aRule, $channel, $controller, $action, &$args)
	{
		$pathkey = "/".$channel."/".$controller."/".($action ? $action : "default");

		$err = array();

		//有args参数才参与检查
		if(!$args || count($args) == 1 && (isset($args['act']) || isset($args['phpsessid'])))
		{
			return;
		}

		//检查key是否已经登记
		if(!array_key_exists($pathkey, $aRule))
		{
			throw new MyException("[".$pathkey."] 还没有在indexRouter.php中登记");
		}

		if($aRule[$pathkey])
		foreach($aRule[$pathkey] as $key => $val)
		{
			if(!array_key_exists($key, $args) && $val['mast'] != 'N')
			{
				$err[] = $key." 不能缺省";
			}
			switch($val['type'])
			{
				case "string" : 
					if(!self::checkString($args[$key], $val) && $val['mast'] != 'N')
					{
						$err[] = $key. " 格式错误";
					}
					break;
				case "estring" : 
					if(!self::checkEstring($args[$key], $val) && $val['mast'] != 'N')
					{
						$err[] = $key. " 格式错误";
					}
					break;
				case "number" : 
					if(!self::checkNumber($args[$key], $val) && $val['mast'] != 'N')
					{
						$err[] = $key. " 格式错误";
					}
					break;
				case "enumber" : 
					if(!self::checkEnumber($args[$key], $val) && $val['mast'] != 'N')
					{
						$err[] = $key. " 格式错误";
					}
					break;
				case "enum" : 
					if(!self::checkEnum($args[$key], $val) && $val['mast'] != 'N')
					{
						$err[] = $key. " 不在允许范围内";
					}
					break;
				case "date" : 
					if(!self::checkDate($args[$key]) && $val['mast'] != 'N')
					{
						$err[] = $key. " 格式错误";
					}
					break;
			}
		}

		//参数非法，显示错误信息
		if($err)
		{
			if(DEBUG_ON == '1')
			{
				throw new MyException(join("\n", $err));
			}

			//跳到首页
			Common::header301("/");
		}

		//注销掉未登记的get变量
		$argsKeys = array_keys($args);
		$allowArgs = array_keys($aRule[$pathkey]);
		foreach($argsKeys as $key)
		{
			if(!in_array($key, $allowArgs))
			{
				unset($args[$key]);
			}
		}
	}

	/**
	 * 检查string类型
	 * 
	 */
	public function checkEstring($value, $rule)
	{
		$value = explode(",", $value);
		if($value)
		{
			foreach($value as $v)
			{
				if(!self::checkString($v, $rule))
				{
					return false;
				}
			}
		}
		return true;
	}

	/**
	 * 检查text_ws类型
	 * 
	 */
	public function checkTextws($value, $rule)
	{
		$value = explode(" ", $value);
		if($value)
		{
			foreach($value as $v)
			{
				if(!self::checkString($v, $rule))
				{
					return false;
				}
			}
		}
		return true;
	}

	/**
	 * 检查string类型
	 * 
	 */
	public function checkString($value, $rule)
	{
		//不是字符串
		if(!preg_match("/[\x{4e00}-\x{9fa5}a-z0-9Ａ-Ｚ０-９]+/ui", $value))
		{
			return false;
		}

		//长度不合格
		if($rule['length'] && strlen($value) != $rule['length'])
		{
			return false;
		}

		//最小长度不合格
		if($rule['minlength'] && strlen($value) < $rule['minlength'])
		{
			return false;
		}

		//最大长度不合格
		if($rule['maxlength'] && strlen($value) > $rule['maxlength'])
		{
			return false;
		}

		return true;
	}
	
	/**
	 * 检查Enumber类型
	 * 
	 */
	public function checkEnumber($value, $rule)
	{
		$value = explode(",", $value);
		if($value)
		{
			foreach($value as $v)
			{
				if(!self::checkNumber($v, $rule))
				{
					return false;
				}
			}
		}
		return true;
	}

	/**
	 * 检查number类型
	 * 
	 */
	public function checkNumber($value, $rule)
	{
		//不是数字
		if(!is_numeric($value))
		{
			return false;
		}

		//长度不合格
		if($rule['length'] && strlen($value) != $rule['length'])
		{
			return false;
		}

		//大小不合格
		if($rule['min'] && $value < $rule['min'])
		{
			return false;
		}

		//大小不合格
		if($rule['max'] && $value < $rule['max'])
		{
			return false;
		}

		return true;
	}
	
	/**
	 * 检查Enum类型
	 * 
	 */
	public function checkEnum($value, $rule)
	{
		if(!in_array($value, $rule['options']))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * 检查date类型
	 * 
	 */
	public function checkDate($value)
	{
		//必须先赋值，不能直接放if里
		$value_new = date("Ymd", strtotime($value));
		if($value_new != $value)
		{
			return false;
		}

		return true;
	}

	/**
	 * 检查表单：密码
	 * 
	 */
	public function checkFormPassword($value)
	{
		if(!preg_match("/[A-Za-z0-9]+/i", $value))
		{
			return false;
		}
		if(strlen($value) < 3 || strlen($value) > 20)
		{
			return false;
		}

		return true;
	}

	/**
	 * 检查表单：真实姓名
	 * 
	 */
	public function checkFormrealname($value)
	{
		if(!preg_match("/[\x{4e00}-\x{9fa5}]+/ui", $value))
		{
			return false;
		}
		if(mb_strlen($value,"utf-8") == 0 || mb_strlen($value,"utf-8") > 4)
		{
			return false;
		}

		return true;
	}

	/**
	 * 检查表单：QQ
	 * 
	 */
	public function checkFormQq($q)
	{
		if(preg_match("/^[1-9][0-9]{4,}$/is", $q))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 检查表单：邮编
	 * 
	 */
	public function checkFormZip($q)
	{
		if(preg_match("/^[0-9]{6}$/is", $q))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 检查表单：邮编
	 * 
	 */
	public function checkFormString($q)
	{
		if(1)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * 检查Email
	 * 
	 */
	public function isEmail($q)
	{
		if(preg_match("/^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$/", $q))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * 检查表单：手机
	 * 
	 */
	public function checkFormMobile($m)
	{
		if(preg_match("/1[358]\d{9}/is", $m))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * 检查表单：电话
	 */
	public function checkFormPhone($phone)
	{
		if(preg_match("/0\d{2,4}-\d{7,8}(-\d{3,5})?/", $phone))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * 检查表单：金额
	 */
//	public function checkFormMoney($phone)
//	{
//		var isFloat=/^[0-9]*(\.[0-9]{1,2})?$/;
//		if(!isFloat.test(temp))
//		{
//			//不是金额类型的数字，如超过2个小数位
//			return false;
//		}
//
//		return true;
//	}

	/**
	 * 检查数字
	 */
	public function isNumber($val)
	{
		if(ereg("^[0-9]+$", $val))
			return true;
		return false;
	}
	
	/**
	 * 检查邮编
	 */
	public function isPostcode($val)
	{
		if(ereg("^[0-9]{4,6}$", $val))
			return true;
		return false;
	}
	
	/**
	 * 检查域名
	 */
	public function isDomain($domain)
	{
		if(strpos($domain, '..') || strpos($domain, '--') || strpos($domain, '.-') || strpos($domain, '-.'))
			Return false;
		
		preg_match("/([^\.\/]{1,63}+\.)?([^\.\/]{1,63}+\.)?[^\.\/]{1,63}\.[a-z]{2,4}$/is", $domain, $out);
		
		if($out[0] !== $domain)
			Return false;
		
		return true;
	}
	
	/**
	 * 是否英文
	 */
	public function isEn($str)
	{
		if(ereg("[\x80-\xff].", $str))
		{
			Return false;
		}
		return true;
	}
	
	/**
	 * 是否中文
	 */
	public function isCh($str)
	{
		if(preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", $str))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * 字符超超过限制
	 */
	public function isLength($str, $min, $max)
	{
		$lenth = mb_strlen($str, "utf8");
		if($lenth <= $max && $lenth >= $min)
		{
			return true;
		}
		return false;
	}

	
	/**
	 * 联系方式是否有效
	 */
	public function isValidNumber($number)
	{
		if(!$number)
		{
			return true;
		}

		$tmp = explode("-", $number);

		//手机或8位电话
		if(!$tmp[1] || strlen($tmp[1]) == 8)
		{
			$last8 = $tmp[1] ? $tmp[1] : substr($tmp[0], -8, 8);
			if(
				$last8 == "12345678"  //连号
				|| $last8 == "87654321" //连号
				|| in_array(join("", array_unique(str_split($last8))), array("1","2","3","4","5","6","7","8","9","0")) //AAAAAAAA，如88888888
				|| substr($last8, 0, 4) == substr($last8, -4, 4) //ABCDABCD，如12341234
			){
				return false;
			}
		}
		else if(strlen($tmp[1]) == 7)
		{
			if($tmp[1] == "1234567" || $tmp[1] == "7654321" || in_array(join("", array_unique(str_split($tmp[1]))), array(1,2,3,4,5,6,7,8,9,0))
			){
				return false;
			}
		}

		return true;
	}
	
	/**
	 * 规则集
	 */
	public function getRegular($str)
	{
		$regular = "";
		$item = explode("|", $str);
		foreach($item as $v){
			switch($v){
				case "Chinese": $regular .= "\x{4e00}-\x{9fa5}"; break;
				case "English": $regular .= "A-Za-z"; break;
				case "Number": $regular .= "0-9"; break;
				case "String": return "/^.*?$/"; break;
				case "Mail": return "/^[\w-\.]+@[\w-]+(\.(\w)+)*(\.(\w){2,4})$/"; break;
				case "Phone": return "/0\d{2,4}-\d{7,8}(-\d{1,5})?/"; break;
				case "Mobile": return "/^(13|15|18)[0-9]{9}$/"; break;
				case "Qq": return "/^[1-9][0-9]{4,15}$/"; break;
				case "Date": return "/^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/"; break;
				case "Money": return "/^[0-9]*(\.[0-9]{1,2})?$/"; break;
			}
		}
		return "/^[" . $regular . "]+$/u";
	}
}

?>